package com.zf.agentuse.in_running;

import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;

import java.io.IOException;

/**
 * 使用 agent-jar 修改 正在运行中的JVM进程 中的类：
 * <p>
 * 将 Agent 通过 JVM Attach 机制打入到 目标 JVM进程中，实现 Agent 中的修改操作：
 * <p>
 * 以下是一个使用JVM TI的例子，使用VirtualMachine类来attach到一个本地Java进程并执行一些基本操作。
 */

public class LoadAgentToTargetJvmProc {

    public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException {
        // 使用 VirtualMachine attach 到目标 JVM 进程, 目标进程通过 jps -l  命令获取
        // 在 JDK8 时 VirtualMachine 类在 tools.jar 中，如果找不到该类，需要手动引入该jar，在Java的安装目录下的lib文件夹中，
        // JDK9及之后 VirtualMachine 类 就在 jdk.attach 模块中了，不需要手动引入依赖了
        VirtualMachine vm = VirtualMachine.attach("6116");

        // 加载指定的 agent 包
        vm.loadAgent("D:\\study-code\\java\\java-agent-demo\\agent-define\\target\\agent-define-0.0.1-SNAPSHOT.jar", "运行时加载agent的入参");

        // 分离
        vm.detach();

    }
}